package com.cti.commons.delayqueue.core;

import org.redisson.api.RScoredSortedSet;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.cti.commons.delayqueue.core.mode.ScoredSortedItem;

/**
 * @author et.wang
 * @description: 一组以时间为维度的有序队列，用来存放所有需要延迟的延时任务（这里只存放延时任务 Id）
 * @date 2022/10/27 19:34
 */
public class DelayBucket {

    private static final Logger logger = LoggerFactory.getLogger(DelayBucket.class);

    @Autowired
    private RedissonClient redissonClient;

    /**
     * 添加 延时任务池 到 延迟任务桶中
     *
     * @param key
     * @param scoredSortedItem
     */
    public void addToBucket(String key, ScoredSortedItem scoredSortedItem) {
        RScoredSortedSet<ScoredSortedItem> scoredSortedSet = redissonClient.getScoredSortedSet(key);
        scoredSortedSet.add(scoredSortedItem.getDelayTime(), scoredSortedItem);
    }

    /**
     * 从延迟任务桶中获取延迟时间最小的 任务
     *
     * @param key
     * @return
     */
    public ScoredSortedItem getFromBucket(String key) {
        RScoredSortedSet<ScoredSortedItem> scoredSortedSet = redissonClient.getScoredSortedSet(key);
        if (scoredSortedSet.size() == 0) {
            return null;
        }
        return scoredSortedSet.first();
    }

    /**
     * 从延迟任务桶中删除 任务
     *
     * @param key
     * @param scoredSortedItem
     */
    public void deleteFormBucket(String key, ScoredSortedItem scoredSortedItem) {
        RScoredSortedSet<ScoredSortedItem> scoredSortedSet = redissonClient.getScoredSortedSet(key);
        boolean remove = scoredSortedSet.remove(scoredSortedItem);
    }

    /**
     * 从延迟任务桶中删除第一个 任务
     *
     * @param key
     */
    public void deleteFormHead(String key) {
        RScoredSortedSet<ScoredSortedItem> scoredSortedSet = redissonClient.getScoredSortedSet(key);
        scoredSortedSet.removeRangeByRank(0, 0);
    }

}
